package com.zdy.im.core;



import com.zdy.im.common.exception.ImException;
import org.tio.core.ChannelContext;
import org.tio.core.TioConfig;
import org.tio.core.intf.Packet;

import javax.websocket.DecodeException;
import java.nio.ByteBuffer;

/**
 * @Author 作者 : zdy
 * @CreateDate 创建时间: 2021-02-30
 * @Version 版本: v1.0.0
 * <pre>
 *
 *  @Description (说明):  根据ByteBuffer解码成业务需要的Packet对象.
 *
 * </pre>
 **/
public interface ImHandler {
    /**
     * 根据ByteBuffer解码成业务需要的Packet对象.
     * 如果收到的数据不全，导致解码失败，请返回null，在下次消息来时框架层会自动续上前面的收到的数据
     * @param buffer 参与本次希望解码的ByteBuffer
     * @param limit ByteBuffer的limit
     * @param position ByteBuffer的position，不一定是0哦
     * @param readableLength ByteBuffer参与本次解码的有效数据（= limit - position）
     * @param imChannelContext
     * @return
     * @throws DecodeException
     */
    ImPacket decode(ByteBuffer buffer, int limit, int position, int readableLength, ChannelContext imChannelContext) throws DecodeException;

    /**
     * 将业务包编码为网络byte字节传输
     * @param imPacket 业务消息包
     * @param imTioConfig IM配置
     * @param imChannelContext 通道上下文
     * @return
     * @author: WChao
     */
    ByteBuffer encode(Packet imPacket, TioConfig imTioConfig, ChannelContext imChannelContext);

    /**
     * 处理消息包
     * @param imPacket 业务消息包
     * @param imChannelContext 通道上下文
     * @throws ImException
     * @author: WChao
     */
    void handler(Packet imPacket, ChannelContext imChannelContext) throws ImException;
}
